// 模拟apply
// Function.prototype.myApply = function(obj, arr) {
//     obj.__proto__.fn = this;
//     let result = obj.fn(...arr);
//     delete obj.__proto__.fn;
//     return result //函数最好有返回值，result没什么用
// }

// function fn1(a, b, c) {
//     console.log(a, b, c);
//     console.log('this', this.x);
//     return 'this is apply'
// }

// let res = fn1.myApply({ x: 100 }, [10, 20, 30]);
// console.log(res);

// 模拟call
// Function.prototype.myCall = function() {
//     // const arr = Array.prototype.slice.call(arguments);
//     // const obj = arr.shift();
//     const obj = [].shift.apply(arguments);
//     // const arr = [];
//     // for (let i = 1; i < arguments.length; i++) {
//     //     arr.push(arguments[i]);
//     // }
//     obj.__proto__.fn = this;
//     let result = obj.fn(...arguments);
//     delete obj.__proto__.fn;
//     return result; //函数最好有返回值，result没什么用
// }

// function fn1(a, b, c) {
//     console.log(a, b, c);
//     console.log('this', this.x);
//     return 'this is call'
// }

// let res = fn1.myCall({ x: 100 }, 10, 20, 30);
// console.log(res);

// 模拟bind

Function.prototype.myBind = function() {
    // const arr = Array.prototype.slice.call(arguments);
    // const obj = arr.shift();
    const obj = [].shift.apply(arguments)
    const arr = [];
    for (let i = 0; i < arguments.length; i++) {
        arr.push(arguments[i]);
    }
    const self = this;
    return function() {
        return self.apply(obj, arr);
    }
}


function fn1(a, b, c) {
    console.log(a, b, c);
    console.log('this', this.x);
    return 'this is bind'
}

let fn2 = fn1.myBind({ x: 100 }, 10, 20, 30);
let res = fn2();
console.log(res);